package com.lhb.aicodemother.ai.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.lhb.aicodemother.ai.model.enums.CodeGenTypeEnum;
import com.lhb.aicodemother.constant.AppConstant;
import com.lhb.aicodemother.exception.BusinessException;
import com.lhb.aicodemother.exception.ErrorCode;

import java.io.File;
import java.nio.charset.StandardCharsets;

/*
* 抽象代码文件保存器 --- 模板方法模式
* */
public abstract class CodeFileSaverTemplate<T> {
    // 文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /*
    * 模板方法：保存代码的标准流程
    * */
    public final File saveCode(T result,Long appId){
        //1.校验
        validateInput(result);
        //2.构建唯一目录
        String dirPath = buildUniqueDir(appId);
        //3.保存文件
        saveFile(result,dirPath);
        //4.返回结果
        return new File(dirPath);
    }

    /*
    * 校验输入
    * */
    protected void validateInput(T result){
        if(result == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"代码结果不能为空");
        }
    }

    /*
    * 构建唯一目录
    * */
    protected final String buildUniqueDir(Long appId){
        if(appId == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"应用ID不能为空");
        }
        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /*
    * 写入单个文件的工具方法
    * */
    protected final void writeToFile(String dirPath,String fileName,String content){
        if(StrUtil.isNotBlank(content)){
            String filePath = dirPath + File.separator + fileName;
            FileUtil.writeString(content,filePath, StandardCharsets.UTF_8);
        }
    }

    /*
    * 获取代码类型，由子类实现
    * */
    protected abstract CodeGenTypeEnum getCodeType();

    /*
    * 保存文件--由子类实现
    * */
    protected abstract void saveFile(T result,String basePath);
}
